package com.zjl.legendary.service.impl;

import com.zjl.legendary.dao.UserDao;
import com.zjl.legendary.entity.User;
import com.zjl.legendary.service.intf.UserService;
import com.zjl.legendary.util.StrUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import javax.servlet.http.HttpSession;
import java.util.Base64;
import java.util.List;

/**
 * 用户表service层实现类
 * @author zhoujingluo
 * @date 2021/5/26 9:03
 */
@Service
@Transactional(isolation = Isolation.DEFAULT,propagation = Propagation.SUPPORTS,
        readOnly = true,rollbackFor = Exception.class)
public class UserServiceImpl implements UserService {
    @Autowired
    private UserDao userDao;

    /**
     * 检查用户名是否可用
     * @param nickname 用户昵称
     * @return true-昵称可用 false-昵称不可用
     */
    @Override
    public boolean checkName(String nickname) {
        //先做非空校验
        if (StrUtils.isNotNull(nickname)){
            //查询数据库
            User user = userDao.selectByName(nickname);
            //对查询结果进行判断
            if (user == null){
                //结果为空，表示昵称可用
                return true;
            }
        }
        //昵称不可用
        return false;
    }

    /**
     * 用户注册
     * @param nickname 用户昵称
     * @param password 用户密码
     * @return true-注册成功 false-注册失败
     */
    @Override
    @Transactional(propagation = Propagation.REQUIRED,readOnly = false)
    public boolean register(String nickname, String password) {
        //参数校验
        if (StrUtils.isNotNull(nickname,password)) {
            //查询数据库
            User user = userDao.selectByName(nickname);
            if (user == null){
                //密码明文转密文
                String encodePassword = Base64.getEncoder().encodeToString(password.getBytes());
                //向数据库中添加用户信息
                return userDao.insert(nickname,encodePassword) > 0;
            }
        }

        return false;
    }

    /**
     * 用户登录
     * @param nickname 用户昵称
     * @param password 用户密码
     * @param session 存储用户登录信息
     * @return true-登录成功 false-登录失败
     */
    @Override
    public boolean login(String nickname, String password, HttpSession session) {
        //参数校验
        if (StrUtils.isNotNull(nickname,password)){
            //查询数据库
            User user = userDao.selectByName(nickname);
            //判断用户是否存在
            if (user != null){
                //比较密码的密文
                if (user.getPassword().equals(Base64.getEncoder().encodeToString(password.getBytes()))){
                    //存储当前登录用户
                    session.setAttribute("user",user);
                    //登录成功
                    return true;
                }
            }
        }
        //登录失败
        return false;
    }

    @Override
    public List<User> showAll() {
        return userDao.selectAll();
    }
}
